package com.spring.redis.operation.service.impl;

import com.spring.redis.operation.contants.RedisKeyUtils;
import com.spring.redis.operation.service.SetRedisService;
import com.spring.redis.operation.service.base.impl.SetRedisBaseServiceImpl;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.SetOperations;
import org.springframework.stereotype.Service;

import java.util.Set;

/**
 * redis 操作set类型缓存
 *
 * @author zhouyu
 */
@Service
public class SetRedisServiceImpl extends SetRedisBaseServiceImpl implements SetRedisService {

    public SetRedisServiceImpl(RedisTemplate<String, Object> redisTemplate, SetOperations<String, Object> setOperations) {
        super(redisTemplate, setOperations);
    }

    /**
     * 将数据放入set缓存
     *
     * @param className 类名称
     * @param key       key
     * @param values    values
     * @return java.lang.Long 放入成功数
     */
    @Override
    public Long add(String className, String key, Object... values) {
        return super.sSet(RedisKeyUtils.getSetKey(className, key), values);
    }

    /**
     * 将数据放入set缓存
     *
     * @param clazz  类名称
     * @param key    key
     * @param values values
     * @return java.lang.Long 放入成功数
     */
    @Override
    public Long add(Class<?> clazz, String key, Object... values) {
        return super.sSet(RedisKeyUtils.getSetKey(clazz, key), values);
    }

    /**
     * 将数据放入set缓存,并设置过期时间
     *
     * @param className 类名称
     * @param key       key
     * @param time      过期时间,单位秒
     * @param values    values
     * @return java.lang.Long 成功个数
     */
    @Override
    public Long addExpire(String className, String key, Long time, Object... values) {
        return super.sSetExpire(RedisKeyUtils.getSetKey(className, key), time, values);
    }

    /**
     * 将数据放入set缓存,并设置过期时间
     *
     * @param clazz  类名称
     * @param key    key
     * @param time   过期时间,单位秒
     * @param values values
     * @return java.lang.Long 成功个数
     */
    @Override
    public Long addExpire(Class<?> clazz, String key, Long time, Object... values) {
        return super.sSetExpire(RedisKeyUtils.getSetKey(clazz, key), time, values);
    }

    /**
     * 根据key获取Set中的所有值
     *
     * @param className 类名称
     * @param key       key
     * @return java.util.Set<Object>
     */
    @Override
    public Set<Object> getAll(String className, String key) {
        return super.sGetAll(RedisKeyUtils.getSetKey(className, key));
    }

    /**
     * 根据key获取Set中的所有值
     *
     * @param clazz 类名称
     * @param key   key
     * @return java.util.Set<Object>
     */
    @Override
    public Set<Object> getAll(Class<?> clazz, String key) {
        return super.sGetAll(RedisKeyUtils.getSetKey(clazz, key));
    }

    /**
     * 根据key,value从一个set中查询,是否存在
     *
     * @param className 类名称
     * @param key       键
     * @param value     值
     * @return java.lang.Boolean 是否存在
     */
    @Override
    public Boolean hasKey(String className, String key, Object value) {
        return super.sHasKey(RedisKeyUtils.getSetKey(className, key), value);
    }

    /**
     * 根据key,value从一个set中查询,是否存在
     *
     * @param clazz 类名称
     * @param key   键
     * @param value 值
     * @return java.lang.Boolean 是否存在
     */
    @Override
    public Boolean hasKey(Class<?> clazz, String key, Object value) {
        return super.sHasKey(RedisKeyUtils.getSetKey(clazz, key), value);
    }

    /**
     * 获取set缓存的长度
     *
     * @param className 类名称
     * @param key       键
     * @return java.lang.Long set长度
     */
    @Override
    public Long size(String className, String key) {
        return super.sSetSize(RedisKeyUtils.getSetKey(className, key));
    }

    /**
     * 获取set缓存的长度
     *
     * @param clazz 类名称
     * @param key   键
     * @return java.lang.Long set长度
     */
    @Override
    public Long size(Class<?> clazz, String key) {
        return super.sSetSize(RedisKeyUtils.getSetKey(clazz, key));
    }

    /**
     * 移除值为value的
     *
     * @param className 类名称
     * @param key       键
     * @param values    值 可以是多个
     * @return java.lang.Long 移除的个数
     */
    @Override
    public Long remove(String className, String key, Object... values) {
        return super.setRemove(RedisKeyUtils.getSetKey(className, key), values);
    }

    /**
     * 移除值为value的
     *
     * @param clazz  类名称
     * @param key    键
     * @param values 值 可以是多个
     * @return java.lang.Long 移除的个数
     */
    @Override
    public Long remove(Class<?> clazz, String key, Object... values) {
        return super.setRemove(RedisKeyUtils.getSetKey(clazz, key), values);
    }

}
